#include "ParserXML.h"
#include <fstream>
#include "ObjetosFactory.h"
#include "../modelo/Objetos/Objeto.h"
#include <typeinfo>  //for 'typeid'
#include <iostream>
ParserXML::ParserXML() { }

ParserXML::~ParserXML() { }

Objeto* ParserXML::instanciarObjeto(TiXmlElement *e) {
	//obtener el tipo y la posicion del objeto e invocar a la factory
	TiXmlNode* pChild1;
	TiXmlNode* pChild2;
	TiXmlAttribute* pAttrib = e->FirstAttribute();
	unsigned short posx = -1, posy = -1;
	string tipo;
	
	if (pAttrib) {
		tipo = pAttrib->Value();
	}
	else {
		cout << "Objeto sin tipo" << endl;
		exit (1);
	}
	
	pChild1 = e->FirstChild();
	pChild2 = pChild1->NextSibling();
	
	if (pChild1 && pChild1->ValueStr() == "posicionx"){
		posx = atoi(pChild1->ToElement()->GetText());
	}
	
	if (pChild2 && pChild2->ValueStr() == "posiciony")
		posy = atoi(pChild2->ToElement()->GetText());
	
	//invocar a la factory con los datos
	ObjetosFactory *factory = ObjetosFactory::get();
	Objeto* o = factory->crearObjeto(tipo, posx, posy);
	return o;
}

void ParserXML::hidratarNodo(TiXmlNode* node, Nivel* nivel) {
	TiXmlNode* pParent = node;
	TiXmlNode* pChild;
	TiXmlAttribute* pAttrib;
	int t = pParent->Type();
	unsigned short tiempo;

	switch (t) {
	case TiXmlNode::TINYXML_DOCUMENT:
		break;

	case TiXmlNode::TINYXML_ELEMENT:
		if (pParent->ValueStr() == "nivel"){
			//leer atributos del nivel
			pAttrib = pParent->ToElement()->FirstAttribute();
			string nombreAtributo = pAttrib->Name();
			if (nombreAtributo == "duracion") {
				nivel->tiempo = atoi(pAttrib->Value());
			}
		}

		if (pParent->ValueStr() == "objeto") {
			//instanciar objeto
			Objeto* o = instanciarObjeto(pParent->ToElement());
			//Agregar al nivel
			if (typeid(*o) == typeid(Cerdo))
				nivel->agregarCerdo((Cerdo*)o);
			else if (typeid(*o) == typeid(Catapulta))
				nivel->agregarCatapulta((Catapulta*)o);
			else if (typeid(*o) == typeid(Monticulo))
				nivel->agregarMonticulo((Monticulo*)o);
			else nivel->agregarObjeto(o);
		}

		break;

	case TiXmlNode::TINYXML_COMMENT:
		break;

	case TiXmlNode::TINYXML_UNKNOWN:
		break;

	case TiXmlNode::TINYXML_TEXT:
		break;

	case TiXmlNode::TINYXML_DECLARATION:
		break;
	
	default:
		break;
	}

	for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) 
	{
		hidratarNodo(pChild, nivel);
	}
}

void ParserXML::hidratarNivel(Nivel* n, string archivoNivel) {
	TiXmlDocument doc(archivoNivel.c_str());
	bool loadOkay = doc.LoadFile();
	if (loadOkay) {
		hidratarNodo(&doc, n);
	}
	else {
		printf("Failed to load file");
	}
}
